package cn.bdqn.controller.admin;

import cn.bdqn.dto.LoginDTO;
import cn.bdqn.dto.LoginUser;
import cn.bdqn.dto.UserDTO;
import cn.bdqn.exception.MyException;
import cn.bdqn.pojo.User.User;
import cn.bdqn.utils.Json;
import cn.bdqn.utils.JwtUtil;
import cn.bdqn.utils.RedisCache;
import cn.hutool.core.bean.BeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

import static cn.bdqn.utils.RedisConstants.*;

@Slf4j
@RestController
@RequestMapping("/api")
public class AdminLoginController {

    @Autowired
    private AuthenticationManager authenticationManager; //注入authenticationManager

    @Autowired
    private RedisCache redisCache;
    @Autowired
    private StringRedisTemplate redisTemplate;

    @PostMapping("/admin/login")
    public Json adminLogin(@RequestBody  LoginDTO user) throws MyException {
        String s = redisTemplate.opsForValue().get(LOGIN_CODE_KEY+user.getPhoneCode());
        if (!user.getCode().equals(s)){
            return Json.fall("验证码错误");
        }
        Authentication authenticate =
                //参数为 第一个账号(手机号) 第二个密码
                //这里会转到 AdminLoginService 里面的实现类型 实现类 会转为 LoginUser类
                authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(user.getPhone(), user.getPassword()));
        if (Objects.isNull(authenticate)){
            //如果为空 抛出异常
            Json.fall("用户名或密码错误");
        }

        log.info("------------执行成功+++用户->"+authenticate.getPrincipal()+"--------------");
        LoginUser users = (LoginUser) authenticate.getPrincipal();
        //获取用户userid使用jwt 工具类加密
        String userId = users.getUser().getUserId().toString();
        System.out.println(userId);
        String jwt = JwtUtil.createJWT(userId);
        log.info("---------------userid 加密后为--->"+jwt+"------------");
        //存入redsi  第一个前缀 第二个 主题 第三个 时间 第四个时间类型
        redisCache.setCacheObject(LOGIN_USER_TOKEN+userId,users,LOGIN_USER_TTL, TimeUnit.MINUTES);
        HashMap<String, Object> map = new HashMap<>();
        map.put("token",jwt);
        map.put("user",users);
        //把token 和转换后的user信息 返还给前端
        return Json.ok(map);
    }





//        throw  new MyException(new FileNotFoundException("文件不存在"),402);
}
